#ifndef FS_FAT_H
#define FS_FAT_H
#ifndef MAX_OPEN_FILES
#define MAX_OPEN_FILES              10          //可以同时打开的文件数目
#endif

#ifndef DISK_CACHE_SIZE
#define DISK_CACHE_SIZE             512         //文件系统Cache大小(字节),应当是最大的扇区所占字节数
#endif

#ifndef MAX_DISK_CACHES
#define MAX_DISK_CACHES             100          //文件系统Cache数目
#endif

#ifndef MAX_DRIVES
#define MAX_DRIVES                  1           //可以同时加载的逻辑驱动器数目
#endif

typedef acoral_32 HANDLE;

#define Not_Open_FILE               -1


/* 底层驱动命令 */
#define DISK_INIT                   0
#define DISK_CLOSE                  1
#define DISK_READ_SECTOR            2
#define DISK_WRITE_SECTOR           3
#define DISK_READ_SUPER_SECTOR           4
/* 底层驱动返回值 */
#define DISK_READ_OK                0x01
#define DISK_READ_NOT_OK            0x80
#define DISK_WRITE_OK               0x02
#define DISK_WRITE_NOT_OK           0x82
#define DISK_INIT_OK                0x03
#define DISK_INIT_NOT_OK            0x83
#define BAD_DISK_COMMAND            0xffff

/* 函数返回值 */
#define RETURN_OK                   0x00    /* 操作成功         */
#define NOT_FIND_DISK               0x01    /* 逻辑盘不存在     */
#define DISK_FULL                   0x02    /* 逻辑盘满         */
#define SECTOR_NOT_IN_CACHE         0x03    /* 扇区没有被cache  */
#define NOT_EMPTY_CACHE             0x04    /* 没有空闲cache    */
#define SECTOR_READ_ERR             0x05    /* 读扇区错误       */
#define CLUSTER_NOT_IN_DISK         0x06    /* 逻辑盘中没有此簇  */
#define NOT_FIND_FDT                0x07    /* 没有发现文件(目录)*/
#define NOT_FAT_DISK                0x08    /* 非FAT文件系统    */
#define FDT_OVER                    0x09    /* FDT索引超出范围  */
#define FDT_EXISTS                  0x0a    /* 文件(目录)已经存在*/
#define ROOT_FDT_FULL               0x0b    /* 根目录满         */
#define DIR_EMPTY                   0x0C    /* 目录空           */
#define DIR_NOT_EMPTY               0x0d    /* 目录不空         */
#define PATH_NOT_FIND               0x0e    /* 路径未找到       */
#define FAT_ERR                     0x0f    /* FAT表错误       */
#define FILE_NAME_ERR               0x10    /* 文件(目录)名错误 */
#define FILE_EOF                    0x11    /* 文件结束        */
#define FILE_LOCK                   0x12    /* 文件被锁定       */
#define NOT_FIND_FILE               0x13    /* 没有发现指定文件 */
#define NOT_FIND_DIR                0x14    /* 没有发现指定目录 */
#define NOT_RUN                     0xfd    /* 命令未执行       */
#define BAD_COMMAND                 0xfe    /* 错误命令       */
#define PARAMETER_ERR               0xff    /* 非法参数        */

/* 未使用的逻辑盘  */
#define EMPTY_DRIVE                 0xff

/* FAT类型 */
#define FAT12                       0
#define FAT16                       1
#define FAT32                       2

/* FDT文件属性 */
#define ATTR_READ_ONLY              0x01
#define ATTR_HIDDEN                 0x02
#define ATTR_SYSTEM                 0x04
#define ATTR_VOLUME_ID              0x08
#define ATTR_DIRECTORY              0x10
#define ATTR_ARCHIVE                0x20

/* 簇类型 */
#define EMPTY_CLUS                  0
#define EMPTY_CLUS_1                1
#define BAD_CLUS                    0x0ffffff7L
#define EOF_CLUS_1                  0x0ffffff8L
#define EOF_CLUS_END                0x0fffffffL

/* FDT类型 */
#define EMPTY_FDT                   0
#define DEL_FDT                     ((char)(0xe5))
#define ESC_FDT                     0x05

/* Cache状态 */
#define CACHE_READED                0x02
#define CACHE_WRITED                0x01

/* 文件指针状态 */
#define FILE_FLAGS_READ             1 << 0          // 可读
#define FILE_FLAGS_WRITE            1 << 1          // 可写

/* 文件指针调整方式 */
#define SEEK_SET    0               // 从文件开始处移动文件指针
#define SEEK_CUR    1               // 从文件当前位置移动文件指针
#define SEEK_END    2               // 从文件尾移动文件指针


/* 给底层驱动读写命令的参数结构体 */
typedef struct _Disk_RW_Parameter
{
	acoral_u8 		Drive;			//操作驱动器号
    acoral_u32      SectorIndex;    // 操作的扇区
    acoral_u32      RsvdForLow;     // 保留给底层驱动程序，由_Disk_Info中拷贝过来 
    acoral_u8       *Buf;           // 数据存储位置
}Disk_RW_Parameter;

/* 文件系统cache数据结构 */
typedef struct _Disk_Cache
{
    acoral_u8       Drive;          // 驱动器号,EMPTY_DRIVE为空闲
    acoral_u8       Flag;           // 状态
    acoral_u16      RW_ID;          // 读写ID,用于释放Cache
//    acoral_u8       Lock;           // 是否锁定扇区
    acoral_u32      SecIndex;       // 缓冲的扇区索引
    acoral_u8       buf[DISK_CACHE_SIZE];
                                // 缓冲区
}Disk_cache;

/* 逻辑盘信息的数据结构 */
typedef struct _Disk_Info
{
    acoral_u8       Drive;          // 逻辑驱动器号，EMPTY_DRIVE为还未分配
    acoral_u8       FATType;        // 类型：FAT12、FAT16和FAT32
    acoral_u8       SecPerClus;     // 每簇扇区数
    acoral_u8       NumFATs;        // FAT表数目

	acoral_id		DevId;

    acoral_u32      SecPerDisk;     // 逻辑驱动器包含扇区数
    acoral_u32      BytsPerSec;     // 每扇区字节数
    acoral_u32      RootDirTable;   // 根目录开始扇区号（FAT32为开始簇号）
    acoral_u32      RootSecCnt;     // 根目录占用扇区数
    acoral_u32      FATStartSec;    // FAT表开始扇区号
    acoral_u32      FATSecCnt;      // 每个FAT占用扇区数
    acoral_u32      DataStartSec;   // 数据区开始扇区号
    acoral_u32      ClusPerData;    // 数据区包含簇数
    acoral_u32      PathClusIndex;  // 当前路径的FDT表开始簇号, 0为根目录 
    acoral_u32      RsvdForLow;     // 保留给底层驱动程序 
    acoral_u16  (* DiakCommand)(acoral_u8 Cammand, void *Parameter);
                                // 对应的驱动程序
}Disk_Info;

/* 目录表数据结构 */
typedef struct _FDT
{
    acoral_char    Name[11];           //短文件名主文件名
    acoral_u8   Attr;               //文件属性
    acoral_u8   NTRes;              //保留给NT
    acoral_u8   CrtTimeTenth;       //建立时间（fat16保留）
    acoral_u16  CrtTime;            //建立时间（fat16保留）
    acoral_u16  CrtDate;            //建立日期（fat16保留）
    acoral_u16  LstAccDate;         //最后访问日期（fat16保留）
    acoral_u16  FstClusHI;          //起始簇号高两个字节（fat16保留）
    acoral_u16  WrtTime;            //最后写时间
    acoral_u16  WrtDate;            //最后写日期
    acoral_u16  FstClusLO;          //起始簇(cluster)号低两个字节
    acoral_u32  FileSize;           //文件大小
} FDT;

/* 文件信息结构体 */
typedef struct _FILE
{
    acoral_u8       Flags;          // 一些标志
    acoral_char        Name[11];       // 文件名
    acoral_u8       Drive;          // 文件所在磁盘
    acoral_u32      DirClus;        // 所在目录开始簇号
    acoral_u32      FileSize;       // 文件大小
    acoral_u32      FstClus;        // 起始簇号
    acoral_u32      Clus;           // 当前簇号
    acoral_u32      Offset;         // 文件指针偏移量
} MY_FILE;


/*******************************************************************************************************/


#ifndef IN_FILE

extern void acoral_fs_init(void);

extern void FileInit(void);
/*********************************************************************************************************
** 函数名称: FileInit
** 功能描述: 初始化文件指针系统
**
** 输　入: 无
**
** 输　出: 无
**         
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern acoral_u8 RemoveFile(acoral_char *DirFileName);
/*********************************************************************************************************
** 函数名称: RemoveFile
** 功能描述: 删除文件
**
** 输　入: DirFileName:用户使用的文件名
**
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: strupr,_GetFileInfo,GetDrive,FindFDTInfo,FATDelClusChain,DelFDT
********************************************************************************************************/

extern HANDLE FileOpen(acoral_char *DirFileName, acoral_char *Type);
/*********************************************************************************************************
** 函数名称: FileOpen
** 功能描述: 以指定方式打开文件
**
** 输　入: DirFileName:用户使用的文件名
**        Type:打开方式
** 输　出: 文件句柄，Not_Open_FILE为不能打开
**         
** 全局变量: 无
** 调用模块: _FileOpenR,_FileOpenW,_FileOpenRW
********************************************************************************************************/

extern acoral_u8 FileClose(HANDLE Handle);
/*********************************************************************************************************
** 函数名称: FileClose
** 功能描述: 关闭指定文件
**
** 输　入: Handle:文件句柄
**
** 输　出: RETURN_OK:成功
**        其它参考fat.h中关于返回值的说明 
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern acoral_u8 FileGetCh(acoral_u8 *Ch, HANDLE Handle);
/*********************************************************************************************************
** 函数名称: FileGetCh
** 功能描述: 从文件读一个字节
**
** 输　入: Ch:返回读到的数据
**        Handle:文件句柄
** 输　出: RETURN_OK:成功
**        其它参考fat.h中关于返回值的说明 
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern acoral_32 FileRead(void *Buf, acoral_u32 Size, HANDLE Handle);
/*********************************************************************************************************
** 函数名称: FileRead
** 功能描述: 读取文件
**
** 输　入: Buf:保存读回的数据
**        Size:要读的字节数
**        Handle:文件句柄
** 输　出: 实际读到的字节数
**         
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern acoral_u8 FilePutCh(acoral_u8 Ch, HANDLE Handle);
/*********************************************************************************************************
** 函数名称: FilePutCh
** 功能描述: 写一个字节到文件
**
** 输　入: Ch:要写的数据
**        Handle:文件句柄
** 输　出: RETURN_OK:成功
**        其它参考fat.h中关于返回值的说明 
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern acoral_32 FileWrite(const void *Buf, acoral_u32 Size, HANDLE Handle);
/*********************************************************************************************************
** 函数名称: FileWrite
** 功能描述: 写文件
**
** 输　入: Buf:要写的数据
**        Size:要写的字节数
**        Handle:文件句柄
** 输　出: 实际写的字节数
**         
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern void FileCloseAll(void);
/*********************************************************************************************************
** 函数名称: FileCloseAll
** 功能描述: 关闭所有打开的文件
**
** 输　入: 无
**
** 输　出: 无
**         
** 全局变量: FileInfo
** 调用模块: AllCacheWriteBack
********************************************************************************************************/

extern acoral_u8 FileEof(HANDLE Handle);
/*********************************************************************************************************
** 函数名称: FileEof
** 功能描述: 判断文件是否到读\写到文件尾
**
** 输　入: Handle:文件句柄
**
** 输　出: 0:否
**        1:是 
** 全局变量: FileInfo
** 调用模块: 无
********************************************************************************************************/

extern acoral_u8 FileSeek(HANDLE Handle, acoral_32 offset, acoral_u8 Whence);
/*********************************************************************************************************
** 函数名称: FileSeek
** 功能描述: 移动文件读\写位置
**
** 输　入: Handle:文件句柄
**        offset:移动偏移量
**        Whence:移动模式SEEK_SET:从文件头计算SEEK_CUR:从当前位置计算SEEK_END:从文件尾计算
** 输　出: 无
**         
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

#endif


/*******************************************************************************************************/


#ifndef IN_DIR

extern acoral_u8 CurrentDrive;

extern acoral_u8 GetDrive(const acoral_char *Path);
/*********************************************************************************************************
** 函数名称: GetDrive
** 功能描述: 获取指定目录的逻辑盘号
**
** 输　入: Path:路径名
**        
** 输　出: 驱动器号
**
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern acoral_u8 ChangeDrive(acoral_char *Drive);
/*********************************************************************************************************
** 函数名称: ChangeDrive
** 功能描述: 改变当前逻辑盘
**
** 输　入: Drive:逻辑盘符字符串
**        
** 输　出: RETURN_OK:成功
**        NOT_FIND_DISK:逻辑盘不存在
**        PARAMETER_ERR:非法参数
** 全局变量: 无
** 调用模块: strupr,GetDiskInfo
********************************************************************************************************/

extern acoral_u32 GetDirClusIndex(acoral_char *Path);
/*********************************************************************************************************
** 函数名称: GetDirClusIndex
** 功能描述: 获取指定目录开始簇号
**
** 输　入: Path:路径名
**        
** 输　出: 开始簇号，EMPTY_CLUS：为根目录
**
** 全局变量: 无
** 调用模块: strupr,GetDiskInfo,FindRootFDTInfo,FindFDTInfo
********************************************************************************************************/

extern acoral_u8 MakeDir(acoral_char *Path);
/*********************************************************************************************************
** 函数名称: MakeDir
** 功能描述: 建立目录
**
** 输　入: Path:路径名
**
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDirClusIndex,strupr,ClearClus,AddRootFDT,AddFDT
********************************************************************************************************/

extern acoral_u8 RemoveDir(acoral_char *Path);
/*********************************************************************************************************
** 函数名称: RemoveDir
** 功能描述: 删除目录
**
** 输　入: Path:路径名
**
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDirClusIndex,strupr,DelRootFDT,DelRootFDT
********************************************************************************************************/

extern acoral_u8 ChangeDir(acoral_char *Path);
/*********************************************************************************************************
** 函数名称: ChangeDir
** 功能描述: 改变当前目录
**
** 输　入: Path:路径名
**
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDirClusIndex,GetDiskInfo
********************************************************************************************************/

#endif



/*******************************************************************************************************/




#ifndef IN_FDT

extern acoral_u8 ClearClus(acoral_u8 Drive, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: ClearClus
** 功能描述: 将指定簇所有数据清零
**
** 输　入: Disk：逻辑盘信息
**        Index：簇号
** 输　出: RETURN_OK:成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,OpenSec,WriteSec,CloseSec
********************************************************************************************************/

extern acoral_u8 ChangeFDT(acoral_u8 Drive, acoral_u32 ClusIndex, FDT *FDTData);
/*********************************************************************************************************
** 函数名称: ChangeFDT
** 功能描述: 改变指定目录指定文件（目录）的属性
**
** 输　入: Rt：存储返回信息的指针
**        Drive：驱动器号
**        ClusIndex：目录首簇号
**        FileName：文件（目录）名
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,GetFDTInfo,SetFDTInfo
********************************************************************************************************/

extern acoral_u8  ReadFDTInfo(FDT *Rt, acoral_u8 Drive, acoral_u32 SecIndex, acoral_u16 ByteIndex);
/*********************************************************************************************************
** 函数名称: ReadFDTInfo
** 功能描述: 读取FDT信息
**
** 输　入: Rt：存储返回信息的指针
**        Drive：驱动器号
**        SecIndex：扇区号
**        ByteIndex：偏移量
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: OpenSec,ReadSec,CloseSec
********************************************************************************************************/

extern acoral_u8  WriteFDTInfo(FDT *FDTData, acoral_u8 Drive, acoral_u32 SecIndex, acoral_u16 ByteIndex);
/*********************************************************************************************************
** 函数名称: WriteFDTInfo
** 功能描述: 读取FDT信息
**
** 输　入: Rt：存储返回信息的指针
**        Drive：驱动器号
**        SecIndex：扇区号
**        ByteIndex：偏移量
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: OpenSec,ReadSec,CloseSec
********************************************************************************************************/

extern acoral_u8 GetFDTInfo(FDT *Rt,acoral_u8 Drive, acoral_u32 ClusIndex, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: GetFDTInfo
** 功能描述: 获取指定目录指定文件（目录）信息
**
** 输　入: Rt：存储返回信息的指针
**        Drive：驱动器号
**        ClusIndex：目录首簇号
**        Index：文件（目录）在FDT中的位置
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,ReadFDTInfo
********************************************************************************************************/

extern acoral_u8 SetFDTInfo(acoral_u8 Drive, acoral_u32 ClusIndex, acoral_u32 Index, FDT *FDTData);
/*********************************************************************************************************
** 函数名称: SetFDTInfo
** 功能描述: 获取指定目录指定文件（目录）信息
**
** 输　入: FDTData：要写入的信息
**        Drive：驱动器号
**        ClusIndex：目录首簇号
**        Index：文件（目录）在FDT中的位置
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,WriteFDTInfo
********************************************************************************************************/

extern acoral_u8 FindFDTInfo(FDT *Rt,acoral_u8 Drive, acoral_u32 ClusIndex, acoral_char FileName[]);
/*********************************************************************************************************
** 函数名称: FindFDT
** 功能描述: 在指定目录查找指定文件（目录）
**
** 输　入: Rt：存储返回信息的指针
**        Drive：驱动器号
**        ClusIndex：目录首簇号
**        FileName：文件（目录）名
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,GetFDTInfo
********************************************************************************************************/

extern acoral_u8 AddFDT(acoral_u8 Drive, acoral_u32 ClusIndex, FDT *FDTData);
/*********************************************************************************************************
** 函数名称: AddFDT
** 功能描述: 在指定目录查增加指定文件（目录）
**
** 输　入: Rt：存储返回信息的指针
**        Drive：驱动器号
**        ClusIndex：目录首簇号
**        FileName：文件（目录）名
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: FindFDT,GetFDTInfo,SetFDTInfo
********************************************************************************************************/

extern acoral_u8 DelFDT(acoral_u8 Drive, acoral_u32 ClusIndex, acoral_char FileName[]);
/*********************************************************************************************************
** 函数名称: DelFDT
** 功能描述: 在指定目录删除指定文件（目录）
**
** 输　入: Drive：驱动器号
**        ClusIndex：目录首簇号
**        FileName：文件（目录）名
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,GetFDTInfo,SetFDTInfo
********************************************************************************************************/

extern acoral_u8 DirIsEmpty(acoral_u8 Drive, acoral_u32 ClusIndex);
/*********************************************************************************************************
** 函数名称: DirIsEmpty
** 功能描述: 
**
** 输　入: Drive：驱动器号
**        ClusIndex：目录首簇号
** 输　出: DIR_EMPTY：空
**        DIR_NOT_EMPTY：不空
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetFDTInfo
********************************************************************************************************/

extern acoral_u8 FDTIsLie(acoral_u8 Drive, acoral_u32 ClusIndex, acoral_char FileName[]);
/*********************************************************************************************************
** 函数名称: FDTIsLie
** 功能描述: 在指定目录查看指定文件（目录）是否存在
**
** 输　入: Drive：驱动器号
**        ClusIndex：目录首簇号
**        FileName：文件（目录）名
** 输　出: RETURN_OK：成功
**        其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,GetFDTInfo
********************************************************************************************************/
#endif



/*******************************************************************************************************/



#ifndef IN_DISK

extern Disk_Info DiskInfo[MAX_DRIVES];

extern void DiskInit(void);
/*********************************************************************************************************
** 函数名称: DiskInit
** 功能描述: 初始化逻辑盘管理模块
**
** 输　入: 无
**
** 输　出: 无
**         
** 全局变量: DiskInfo
** 调用模块: 无
********************************************************************************************************/

extern Disk_Info * GetDiskInfo(acoral_u8 Drive);
/*********************************************************************************************************
** 函数名称: GetDiskInfo
** 功能描述: 获取指定逻辑盘信息
**
** 输　入: 逻辑盘号
**
** 输　出: 指向逻辑盘信息的结构体指针
**         
** 全局变量: DiskInfo
** 调用模块: 无
********************************************************************************************************/

extern Disk_Info * GetEmptyDiskInfoAddr(void);
/*********************************************************************************************************
** 函数名称: GetEmptyDiskInfoAddr
** 功能描述: 获取空闲逻辑盘
**
** 输　入: 无
**
** 输　出: 指向逻辑盘信息的结构体指针
**         
** 全局变量: DiskInfo
** 调用模块: 无
********************************************************************************************************/

extern void AddFileDriver(acoral_u16  (* DiakCommand)(acoral_u8 Cammand, void *Parameter),acoral_char *devname);
/*********************************************************************************************************
** 函数名称: AddFileDriver
** 功能描述: 增加一个底层驱动程序
**
** 输　入: DiakCommand：驱动程序接口函数
**
** 输　出: 无
**         
** 全局变量: DiskInfo
** 调用模块: 无
********************************************************************************************************/

extern void RemoveFileDriver(acoral_u8 Drive);
/*********************************************************************************************************
** 函数名称: RemoveFileDriver
** 功能描述: 删除一个底层驱动程序
**
** 输　入: Drive:逻辑驱动器号
**
** 输　出: 无
**         
** 全局变量: DiskInfo
** 调用模块: 无
********************************************************************************************************/
#endif



/*******************************************************************************************************/



#ifndef IN_RWSEC

extern void CacheInit(void);
/*********************************************************************************************************
** 函数名称: CacheInit
** 功能描述: 初始化磁盘cache
**
** 输　入: 无
**
** 输　出: 无
**         
** 全局变量: DiskCache
** 调用模块: 无
********************************************************************************************************/

extern void CloseSec(acoral_u8 Drive, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: CloseSec
** 功能描述: 解锁指定cache（允许切换出内存）
**
** 输　入: Drive：逻辑驱动器号
**        Index：缓冲的扇区号
** 输　出: 无
**         
** 全局变量: DiskCache
** 调用模块: 无
********************************************************************************************************/

extern void CacheWriteBack2(acoral_u16 Index);
/*********************************************************************************************************
** 函数名称: CacheWriteBack2
** 功能描述: 把指定扇区写回逻辑盘
**
** 输　入: Index：cache索引
**
** 输　出: 无
**         
** 全局变量: DiskCache
** 调用模块: GetDiskInfo
********************************************************************************************************/

extern void CacheWriteBack(acoral_u8 Drive, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: CacheWriteBack
** 功能描述: 把指定cache写回逻辑盘
**
** 输　入: Drive：逻辑驱动器号
**        Index：缓冲的扇区号
** 输　出: 无
**         
** 全局变量: DiskCache
** 调用模块: CacheWriteBack2
********************************************************************************************************/

extern void AllCacheWriteBack(void);
/*********************************************************************************************************
** 函数名称: AllCacheWriteBack
** 功能描述: 把所有已改变的扇区写回逻辑盘
**
** 输　入: 无
**
** 输　出: 无
**         
** 全局变量: DiskCache
** 调用模块: CacheWriteBack2
********************************************************************************************************/

extern acoral_u16 GetCache(void);
/*********************************************************************************************************
** 函数名称: GetCache
** 功能描述: 获取一个cache
**
** 输　入: 无
**
** 输　出: cache索引
**         
** 全局变量: DiskCache
** 调用模块: 无
********************************************************************************************************/

extern acoral_u8 *OpenSec(acoral_u8 Drive, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: OpenSec
** 功能描述: 为逻辑盘上的一个扇区打开一个cache并锁定
**
** 输　入: Drive：磁盘号
**        Index：扇区号
** 输　出: 指向指定扇区数据的指针
**         
** 全局变量: DiskCache
** 调用模块: 无
********************************************************************************************************/

extern acoral_u8 ReadSec(acoral_u8 Drive, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: ReadSec
** 功能描述: 从逻辑盘读扇区
**
** 输　入: Disk：逻辑盘信息
**        Index：扇区号
** 输　出: TRUE:成功
**         FALSE:失败
** 全局变量: DiskCache
** 调用模块: GetDiskInfo
********************************************************************************************************/

extern void WriteSec(acoral_u8 Drive, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: WriteSec
** 功能描述: 说明指定逻辑盘的指定一个扇区被改写
**
** 输　入: Disk：逻辑盘信息
**        Index：扇区号
** 输　出: 无
**         
** 全局变量: DiskCache
** 调用模块: 无
********************************************************************************************************/

#endif




/*******************************************************************************************************/




#ifndef IN_FAT

extern acoral_u32 FATGetNextClus(acoral_u8 Drive, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: FATGetNextClus
** 功能描述: 返回FAT表指定簇的下一个簇号
**
** 输　入: Drive：驱动器号
**        Index：簇号
** 输　出: 下一个簇号
**         
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

void FATSetNextClus(acoral_u8 Drive, acoral_u32 Index, acoral_u32 Next);
/*********************************************************************************************************
** 函数名称: FATSetNextClus
** 功能描述: 删除指定簇链
**
** 输　入: Drive：驱动器号
**        Index：簇链中首簇号
**        Next：下一个簇号
** 输　出: 无
**         
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/


extern acoral_u32 FATAddClus(acoral_u8 Drive, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: FATAddClus
** 功能描述: 为指定簇链增加一个簇
**
** 输　入: Drive：驱动器号
**        Index：簇链中任意一个簇号，如果为0，则为一个空链增加一个簇
** 输　出: 增加的簇号
**         
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern void FATDelClusChain(acoral_u8 Drive, acoral_u32 Index);
/*********************************************************************************************************
** 函数名称: FATDelClusChain
** 功能描述: 删除指定簇链
**
** 输　入: Drive：驱动器号
**        Index：簇链中首簇号
** 输　出: 无
**         
** 全局变量: 无
** 调用模块: FATGetNextClus
********************************************************************************************************/
#endif

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/
#endif
